package in.rob.client.widget; import in.lib.Constants; import in.lib.Constants.StreamList; import in.lib.manager.CacheManager; import in.lib.manager.SettingsManager; import in.lib.manager.UserManager; import in.lib.utils.html.ADNHtml; import in.model.Post; import in.model.Stream; import in.model.User; import in.rob.client.R; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import lombok.Getter; import android.app.NotificationManager; import android.appwidget.AppWidgetManager; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.graphics.Bitmap; import android.preference.PreferenceManager; import android.text.TextUtils; import android.widget.RemoteViews; import android.widget.RemoteViewsService; public class ScrollWidgetService extends RemoteViewsService { public class WidgetViewsFactory implements RemoteViewsService.RemoteViewsFactory { @Getter private final Context context; private final int widgetID; private int listItemRes = -1; private Stream timelineStream; private String streamStr; private String accountId; public WidgetViewsFactory(Context ctx, Intent intent) { this.context = ctx; this.widgetID = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); streamStr = prefs.getString("scroller_stream_id_" + widgetID, StreamList.TIMELINE.toString()); accountId = prefs.getString(Constants.PREFS_SCROLL_WIDGET_USER_ID + widgetID, UserManager.getUserId()); listItemRes = prefs.getString("scroller_theme_" + widgetID, "Light").equals("Light") ? R.layout.widget_message_list_item : R.layout.widget_message_list_item_dark; timelineStream = CacheManager.getInstance().readFileAsObject(String.format(streamStr, accountId), new Stream()); } @Override public int getCount() { return timelineStream.getObjects().size(); } @Override public long getItemId(int position) { return position; } @Override public RemoteViews getLoadingView() { return null; } @Override public RemoteViews getViewAt(int position) { final RemoteViews row = new RemoteViews(getContext().getPackageName(), listItemRes); if (position < getCount()) { Post post = ((Post)timelineStream.getObjects().get(position)); String dateStr = calculateDateString(post.getDate()); row.setTextViewText(R.id.title, "@" + post.getPoster().getMentionName()); row.setTextViewText(R.id.sub_title, post.getPoster().getUserName()); row.setTextViewText(R.id.time, dateStr); row.setTextViewText(R.id.text, ADNHtml.fromHtml(post.getFormattedText())); Bitmap b = User.loadAvatar(getContext(), post.getPoster().getId()); if (b != null) { row.setImageViewBitmap(R.id.avatar, b); } else { row.setImageViewResource(R.id.avatar, R.drawable.default_avatar); } Intent intent = new Intent(); intent.putExtra(Constants.EXTRA_POST, post); row.setOnClickFillInIntent(R.id.root_view, intent); } return row; } public String calculateDateString(long date) { GregorianCalendar cal = new GregorianCalendar(); GregorianCalendar todayDate = new GregorianCalendar(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DATE)); long startDate = todayDate.getTimeInMillis(); String time = SettingsManager.getDateFormat().format(new Date(date)) + "\n" + SettingsManager.getTimeFormat().format(new Date(date)); return time; } @Override public int getViewTypeCount() { return 1; } @Override public boolean hasStableIds() { return true; } @Override public void onDataSetChanged() { NotificationManager manager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE); manager.cancel(widgetID); if (!TextUtils.isEmpty(streamStr)) { timelineStream = CacheManager.getInstance().readFileAsObject(String.format(streamStr, accountId), new Stream()); } } @Override public void onCreate(){} @Override public void onDestroy(){} } @Override public RemoteViewsFactory onGetViewFactory(Intent intent) { return new WidgetViewsFactory(getApplicationContext(), intent); } }